package com.demo.framework.utils;

import java.util.ArrayList;
import java.util.HashMap;

import android.content.Context;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.text.TextUtils;

import com.demo.framework.utils.apn.ApnNode;
import com.demo.framework.utils.apn.ApnUtility;

/**
 * 
 * @ClassName: NetWorkUtil
 * @Description: TODO(网络工具 （判断当前的网络接入点等）)
 * @author 谢云腾
 * @date 2013-3-22 上午11:17:51
 * @version 1.0
 */
public class NetWorkUtil {

    public static final String CTWAP = "ctwap";

    public static final String CMWAP = "cmwap";

    public static final String WAP_3G = "3gwap";

    public static final String UNIWAP = "uniwap";

    public static final int TYPE_NET_WORK_DISABLED = 0;// 网络不可用

    public static final int TYPE_CM_CU_WAP = 4;// 移动联通wap10.0.0.172

    public static final int TYPE_CT_WAP = 5;// 电信wap 10.0.0.200

    public static final int TYPE_OTHER_NET = 6;// 电信,移动,联通,wifi 等net网络

    public static Uri PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn");

    /***
     * 判断Network具体类型（联通移动wap，电信wap，其他net）
     * 
     * */
    public static int getNetworkType(Context mContext) {
        try {
            final ConnectivityManager connectivityManager = (ConnectivityManager) mContext
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            final NetworkInfo mobNetInfoActivity = connectivityManager.getActiveNetworkInfo();
            if (mobNetInfoActivity == null || !mobNetInfoActivity.isAvailable()) {
                // 注意一：
                // NetworkInfo 为空或者不可以用的时候正常情况应该是当前没有可用网络，
                // 但是有些电信机器，仍可以正常联网，
                // 所以当成net网络处理依然尝试连接网络。
                // （然后在socket中捕捉异常，进行二次判断与用户提示）。
                return TYPE_OTHER_NET;
            }
            else {
                // NetworkInfo不为null开始判断是网络类型
                int netType = mobNetInfoActivity.getType();
                if (netType == ConnectivityManager.TYPE_WIFI) {
                    // wifi net处理
                    return TYPE_OTHER_NET;
                }
                else if (netType == ConnectivityManager.TYPE_MOBILE) {
                    // 注意二：
                    // 判断是否电信wap:
                    // 不要通过getExtraInfo获取接入点名称来判断类型，
                    // 因为通过目前电信多种机型测试发现接入点名称大都为#777或者null，
                    // 电信机器wap接入点中要比移动联通wap接入点多设置一个用户名和密码,
                    // 所以可以通过这个进行判断！
                    final Cursor c = mContext.getContentResolver().query(PREFERRED_APN_URI, null, null, null, null);
                    if (c != null) {
                        c.moveToFirst();
                        final String user = c.getString(c.getColumnIndex("user"));
                        if (!TextUtils.isEmpty(user)) {
                            if (user.startsWith(CTWAP)) {
                                return TYPE_CT_WAP;
                            }
                        }
                    }
                    c.close();
                    // 注意三：
                    // 判断是移动联通wap:
                    // 其实还有一种方法通过getString(c.getColumnIndex("proxy")获取代理ip
                    // 来判断接入点，10.0.0.172就是移动联通wap，10.0.0.200就是电信wap，但在
                    // 实际开发中并不是所有机器都能获取到接入点代理信息，例如魅族M9 （2.2）等...
                    // 所以采用getExtraInfo获取接入点名字进行判断
                    String netMode = mobNetInfoActivity.getExtraInfo();
                    if (netMode != null) {
                        // 通过apn名称判断是否是联通和移动wap
                        netMode = netMode.toLowerCase();
                        if (netMode.equals(CMWAP) || netMode.equals(WAP_3G) || netMode.equals(UNIWAP)) {
                            return TYPE_CM_CU_WAP;
                        }
                    }
                }
            }
        }
        catch(Exception ex) {
            ex.printStackTrace();
            return TYPE_OTHER_NET;
        }
        return TYPE_OTHER_NET;
    }

    /**
     * 判断是否开启网络
     * 
     * @param context
     * @return
     */
    public static boolean isNetworkAvailable(Context context) {
        boolean isSuccessConnect = false;
        ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity == null) {
            return false;
        }
        else {
            try {
                NetworkInfo[] info = connectivity.getAllNetworkInfo();
                if (info != null) {
                    for (int i = 0; i < info.length; i++) {
                        if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                            isSuccessConnect = true;
                            return isSuccessConnect;
                        }
                    }
                }
            }
            catch(Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return isSuccessConnect;
    }
    
    

    /**
     * 返回Wifi是否启用
     * @param c
     * @return
     */
    public static boolean isWIFIActivate(Context c) {
        return ((WifiManager) c.getSystemService(Context.WIFI_SERVICE)).isWifiEnabled();
    }
    

    /**
     * 设置网络接入点为 cmnet
     */
    public void setDefaultCMNENTAPN(Context context) {
        // if (apnUtil == null) {
        ApnUtility apnUtil = new ApnUtility(context);
        // }
        if (apnUtil.GetCurrentNetType() == 1) {
            ApnNode node = apnUtil.getDefaultAPN();
            if (node != null && node.getName() != null && node.getName().equalsIgnoreCase("cmwap")) {
                apnUtil.Delete_Apn(node.getId());
                apnUtil.AddCMWAPApn();

                ArrayList<HashMap<String, String>> apnHashMap = apnUtil.GetApnList();
                if (apnHashMap != null && apnHashMap.size() > 0) {
                    int size = apnHashMap.size();
                    HashMap<String, String> map = null;
                    String name = null;
                    int _id = 0;
                    for (int i = 0; i < size; i++) {
                        map = (HashMap<String, String>) apnHashMap.get(i);
                        name = (String) map.get("apn");
                        _id = Integer.parseInt((String) map.get("id"));
                        if (name != null && name.equalsIgnoreCase("cmnet")) {
                            if (_id > 0) {
                                apnUtil.setDefaultApn(_id);
                                break;
                            }
                        }
                    }
                }
            }
        }
    }
}
